package br.edu.unifei.cct720.trabalho08.modelo.formas;

import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;

import br.edu.unifei.cct720.trabalho08.modelo.ponto.Ponto2D;
import br.edu.unifei.cct720.trabalho08.modelo.ponto.Ponto3D;
import br.edu.unifei.cct720.trabalho08.modelo.transformacao.Transformacao3D;
import br.edu.unifei.cct720.trabalho08.modelo.transformacao.Transformacao3D.Eixo;

public class Objeto implements FormaGeometrica {
	
	private ArrayList<Ponto3D> lista3D;
	private ArrayList<Ponto2D> lista2D;

	/**
	 * Construtor
	 * 
	 * @param lista3D
	 */
	public Objeto(ArrayList<Ponto3D> lista3D) {
		this.setLista3D(lista3D);
	}

	/**
	 * Devolve o valor maximo do objeto no eixo informado
	 * 
	 * @param eixo
	 * @return
	 */
	public int getMax3D(Eixo eixo) {
		int max = 0;

		if (eixo == Eixo.X) {
			max = lista3D.get(0).getX();
		} else if (eixo == Eixo.Y) {
			max = lista3D.get(0).getY();
		} else if (eixo == Eixo.Z) {
			max = lista3D.get(0).getZ();
		}

		for (Ponto3D p3d : lista3D) {
			if (eixo == Eixo.X) {
				if (max < p3d.getX()) {
					max = p3d.getX();
				}
			}

			if (eixo == Eixo.Y) {
				if (max < p3d.getY()) {
					max = p3d.getY();
				}
			}

			if (eixo == Eixo.Z) {
				if (max < p3d.getZ()) {
					max = p3d.getZ();
				}
			}
		}

		return max;
	}

	/**
	 * Devolve o valor minimo do objeto no eixo informado
	 * 
	 * @param eixo
	 * @return
	 */
	public int getMin3D(Eixo eixo) {
		int min = 0;

		if (eixo == Eixo.X) {
			min = lista3D.get(0).getX();
		} else if (eixo == Eixo.Y) {
			min = lista3D.get(0).getY();
		} else if (eixo == Eixo.Z) {
			min = lista3D.get(0).getZ();
		}

		for (Ponto3D p3d : lista3D) {
			if (eixo == Eixo.X) {
				if (min > p3d.getX()) {
					min = p3d.getX();
				}
			}

			if (eixo == Eixo.Y) {
				if (min > p3d.getY()) {
					min = p3d.getY();
				}
			}

			if (eixo == Eixo.Z) {
				if (min > p3d.getZ()) {
					min = p3d.getZ();
				}
			}
		}

		return min;
	}

	/**
	 * Devolve as retas dos objetos
	 * 
	 * @return
	 */
	public ArrayList<Reta> getRetas() {
		ArrayList<Reta> retas = new ArrayList<Reta>();
		for (int i = 0; i < lista2D.size(); i += 2) {
			retas.add(new Reta(lista2D.get(i), lista2D.get(i + 1)));
		}
		return retas;
	}

	/**
	 * Devolve o centro do obejto
	 * 
	 * @return
	 */
	public Ponto3D getCentro() {
		int max = getMax3D(Eixo.X);
		int min = getMin3D(Eixo.X);
		int x = max - ((max - min) / 2);

		max = getMax3D(Eixo.Y);
		min = getMin3D(Eixo.Y);
		int y = max - ((max - min) / 2);

		max = getMax3D(Eixo.Z);
		min = getMin3D(Eixo.Z);
		int z = max - ((max - min) / 2);

		return new Ponto3D(x, y, z);
	}

	public ArrayList<Ponto3D> getLista3D() {
		return lista3D;
	}

	public ArrayList<Ponto2D> getLista2D() {
		return lista2D;
	}

	public void setLista3D(ArrayList<Ponto3D> lista3D) {
		this.lista3D = new ArrayList<Ponto3D>();
		this.lista3D.addAll(lista3D);

		ArrayList<Ponto2D> lista = new ArrayList<Ponto2D>();
		for (Ponto3D ponto3D : lista3D) {
			lista.add(Transformacao3D.converte3Dpara2D(ponto3D));
		}

		this.setLista2D(lista);
	}

	public void setLista2D(ArrayList<Ponto2D> lista2D) {
		this.lista2D = new ArrayList<Ponto2D>();
		this.lista2D.addAll(lista2D);
	}

	@Override
	public List<Ponto2D> getPontos() {
		// TODO Auto-generated method stub
		return null;
	}
}
